package com.criticalritrpg.fichas;

import java.util.regex.Pattern;

import com.RPGDice.RollMain;
import com.criticalritrpg.R;
import com.criticalritrpg.bd.BDFicha;
import com.criticalritrpg.conexoes.*;

import android.R.string;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.TabActivity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;
import android.widget.Toast;

public class TabWidgetFichaActivity extends TabActivity{
	
	private BDFicha bd;
	private Cursor mCursor;
	//
	private TabHost tbHost;
	private TabSpec spec;
	private Button btSend,btSalvabd;
	//private EditText ed;
	private FichaBasica fichabasica;
	private FichaDefesa fichaDefesa;
	private Spinner sp_jogadores;
	private FichaAtributo fichaAtributo;
	private StringBuffer fichaEnvia;
	//
	
	// Debugging
    private static final String TAG = "CriarJOgo";
    private static final boolean D = true;

    // Message types sent from the BluetoothChatService Handler
    public static final int MESSAGE_STATE_CHANGE = 1;
    public static final int MESSAGE_READ = 2;
    public static final int MESSAGE_WRITE = 3;
    public static final int MESSAGE_DEVICE_NAME = 4;
    public static final int MESSAGE_TOAST = 5;

    // Key names received from the BluetoothChatService Handler
    public static final String DEVICE_NAME = "device_name";
    public static final String TOAST = "toast";

    // Intent request codes
    private static final int REQUEST_CONNECT_DEVICE_SECURE = 1;
    private static final int REQUEST_CONNECT_DEVICE_INSECURE = 2;
    private static final int REQUEST_ENABLE_BT = 3;
    
    private int flag; 

    // Layout Views
    //private ListView mConversationView;
    //private EditText mOutEditText;
    //private Button mSendButton;
	
    //
    // Name of the connected device
    private String mConnectedDeviceName = null;
    // Array adapter for the conversation thread
    private ArrayAdapter<String> mConversationArrayAdapter;
    // String buffer for outgoing messages
    private StringBuffer mOutStringBuffer;
    // Local Bluetooth adapter
    private BluetoothAdapter mBluetoothAdapter = null;
    // Member object for the chat services
    private BluetoothChatService mChatService = null;
	//
    
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.fichas);
		flag = getIntent().getFlags();
		fichaEnvia = new StringBuffer();
		
		//come�o abas
		btSend = (Button) findViewById(R.id.sendFichas);
		//ed = (EditText) findViewById(R.id.editText1);
		btSalvabd = (Button) findViewById(R.id.btSalvaBDFicha);
		
		bd = new BDFicha(getApplicationContext());
		if(flag>0){
		mCursor = bd.all(flag);}
		if(mCursor!=null)startManagingCursor(mCursor);
		
		String[] columns = new String[] { "nomeJogador" };
		int[] to = new int[] { android.R.id.text1 };
		
		SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, mCursor, columns, to);
		mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		//mCursor.close();
		sp_jogadores = (Spinner) findViewById(R.id.spinnerJogadores);
		sp_jogadores.setAdapter(mAdapter);
		
		
		fichabasica = FichaBasica.getInstance();
		fichaDefesa = FichaDefesa.getInstance();
		fichaAtributo = FichaAtributo.getInstance();
		if(flag>0){
			setBasica();
			setFichaDef();
			setFichaAtributo();
			
		}
		
		
		if(flag==0 || flag ==-1){
			sp_jogadores.setVisibility(View.INVISIBLE);
			btSend.setVisibility(View.INVISIBLE);
			//ed.setVisibility(View.INVISIBLE);
		}
		if(flag==-1){
			btSalvabd.setVisibility(View.INVISIBLE);
		}
		
		tbHost = getTabHost();
		//TabHost.TabSpec spec;
		Intent intent;
		
		intent = new Intent().setClass(this, TabFichaBasico.class);
		intent.setFlags(flag);
		spec = tbHost.newTabSpec("tab1").setIndicator("Ficha: Basico")
				.setContent(intent);
		tbHost.addTab(spec);

		intent = new Intent().setClass(this, TabFichaAtributo.class);
		intent.setFlags(flag);
		spec = tbHost.newTabSpec("tab2").setIndicator("Atributos")
				.setContent(intent);
		tbHost.addTab(spec);

		intent = new Intent().setClass(this, TabFichaDefesa.class);
		intent.setFlags(flag);
		spec = tbHost.newTabSpec("tab3").setIndicator("Defesas")
				.setContent(intent);
		
		tbHost.addTab(spec);

		tbHost.setCurrentTab(0);
		//fim abas
		
		
		//spinerlis
		sp_jogadores.setOnItemSelectedListener(new OnItemSelectedListener() {

			public void onItemSelected(AdapterView<?> arg0, View arg1,
					int arg2, long arg3) {
				// TODO Auto-generated method stub
				//String personagem = ((TextView)arg1).getText().toString();
				//mCursor.moveToFirst();
				//mCursor.moveToLast();
				String mac = mCursor.getString(21);
				setBasica();
				setFichaDef();
				setFichaAtributo();
				connectDevice(mac,false);
				
				Toast.makeText(getApplicationContext(), mac, Toast.LENGTH_LONG).show();
			}

			public void onNothingSelected(AdapterView<?> arg0) {
				// TODO Auto-generated method stub
				
			}
		});
		
		//
		if(D) Log.e(TAG, "+++ ON CREATE +++");
		// Get local Bluetooth adapter
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        // If the adapter is null, then Bluetooth is not supported
        if (mBluetoothAdapter == null) 
        {
            Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
            finish();
            return;
        }
        
        //AlertDialog.Builder ab = new AlertDialog.Builder(this);
        //ab.setTitle("Welcome");
        //ab.setMessage("HI Bahar");
        /*ab.setPositiveButton(R.string,new DialogInterface.OnClickListener() 
        {
        	public void onClick(DialogInterface dialog, int whichButton) 
        	{}
        });*/
       // ab.show();
		
		
	}

	//inicio chat
	@Override
	public synchronized void onResume() 
	    {
	        super.onResume();
	        Log.i("MyTag", "BaharAli");
	        if(D) Log.e(TAG, "+ ON RESUME +");
	        //bd.close();
	        // Performing this check in onResume() covers the case in which BT was
	        // not enabled during onStart(), so we were paused to enable it...
	        // onResume() will be called when ACTION_REQUEST_ENABLE activity returns.
	      
	        
	         if (mChatService != null) 
	        {
	            // Only if the state is STATE_NONE, do we know that we haven't started already
	            if (mChatService.getState() == BluetoothChatService.STATE_NONE) 
	            {
	              // Start the Bluetooth chat services
	              mChatService.start();
	            }
	        }
	    }
	
	private void setupChat() 
    {
        Log.d("set", "setupChat()");

        // Initialize the array adapter for the conversation thread
        //mConversationArrayAdapter = new ArrayAdapter<String>(this, R.layout.message);
        //mConversationView = (ListView) findViewById(R.id.in);
        //mConversationView.setAdapter(mConversationArrayAdapter);

        // Initialize the compose field with a listener for the return key
        //mOutEditText = (EditText) findViewById(R.id.edit_text_out);
        //mOutEditText.setOnEditorActionListener(mWriteListener);

        // Initialize the send button with a listener that for click events
        btSend = (Button) findViewById(R.id.sendFichas);
        //Toast.makeText(getApplicationContext(), "m.getIdade()"+"",
          //      Toast.LENGTH_SHORT).show();
        btSend.setOnClickListener(new OnClickListener() {
            public void onClick(View v) 
            {
                // Send a message using content of the edit text widget
                //TextView view = (TextView) findViewById(R.id.edit_text_out);
                String fb = fichabasica.toString();
                String fd = fichaDefesa.toString();
                String fa = fichaAtributo.toString();
                fichaEnvia.append(fb);
                fichaEnvia.append(fd);
                fichaEnvia.append(fa);
                Log.d("msg", fichaEnvia.toString());
                sendMessage(fichaEnvia.toString());
                
                
            }
        });
        
        btSalvabd.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View arg0) {
				carregaBasica(fichabasica);
				carregaAtributo(fichaAtributo);
				carregaDefesa(fichaDefesa);
				sendMessage(fichaEnvia.toString());
				
				
				
				
			}
		});

        // Initialize the BluetoothChatService to perform bluetooth connections
        //BaharAli
        mChatService = new BluetoothChatService(TabWidgetFichaActivity.this, mHandler);
        // Initialize the buffer for outgoing messages
        mOutStringBuffer = new StringBuffer("");
    }

	@Override
    public synchronized void onPause() 
    {
        super.onPause();
        //bd.close();
        //mCursor.close();
        if(D) Log.e(TAG, "- ON PAUSE -");
    }

    @Override
    public void onStop() 
    {	   	
    	super.onStop();
        if(D) Log.e(TAG, "-- ON STOP --");
        if(mCursor!=null) mCursor.close();
        if(bd!=null) bd.close();
        finish();
    	
    }

    @Override
    public void onDestroy() 
    {
        super.onDestroy();
        // Stop the Bluetooth chat services
        if(bd!=null) bd.close();
       
        if(mCursor!=null)mCursor.close();
        if (mChatService != null) mChatService.stop();
        if(D) Log.e(TAG, "--- ON DESTROY ---");
    }

    private void ensureDiscoverable() 
    {
        if(D) Log.d(TAG, "ensure discoverable");
        if (mBluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) 
        {
            Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
            discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
            startActivity(discoverableIntent);
        }
    }

    /**
     * Sends a message.
     * @param message  A string of text to send.
     */
    private void sendMessage(String message) 
    {
        // Check that we're actually connected before trying anything
        if (mChatService.getState() != BluetoothChatService.STATE_CONNECTED) 
        {
            Toast.makeText(this, R.string.not_connected, Toast.LENGTH_SHORT).show();
            return;
        }

        // Check that there's actually something to send
        if (message.length() > 0) 
        {
            // Get the message bytes and tell the BluetoothChatService to write
            byte[] send = message.getBytes();
            mChatService.write(send);

            // Reset out string buffer to zero and clear the edit text field
            mOutStringBuffer.setLength(0);
            //mOutEditText.setText(mOutStringBuffer);
            
        }
    }

    // The action listener for the EditText widget, to listen for the return key
    private TextView.OnEditorActionListener mWriteListener = new TextView.OnEditorActionListener() 
    {
        public boolean onEditorAction(TextView view, int actionId, KeyEvent event) 
        {
            // If the action is a key-up event on the return key, send the message
            if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_UP) 
            {
                String message = view.getText().toString();
                //sendMessage(message);
            }
            if(D) Log.i(TAG, "END onEditorAction");
            return true;
        }
    };

    private final void setStatus(int resId) 
    {
       // final ActionBar actionBar = getActionBar();
       //actionBar.setSubtitle(resId);
    }

    private final void setStatus(CharSequence subTitle) 
    {
        //final ActionBar actionBar = getActionBar();
        //actionBar.setSubtitle(subTitle);
    }

    // The Handler that gets information back from the BluetoothChatService
    private final Handler mHandler = new Handler() 
    {
        @Override
        public void handleMessage(Message msg) 
        {
            switch (msg.what) 
            {
            case MESSAGE_STATE_CHANGE:
                if(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1);
                switch (msg.arg1) 
                {
                case BluetoothChatService.STATE_CONNECTED:
                    setStatus(getString(R.string.title_connected_to, mConnectedDeviceName));
                   if(flag == 0){
                    AlertDialog.Builder ab = new AlertDialog.Builder(TabWidgetFichaActivity.this);
                    ab.setTitle("Modo jogador");
                    ab.setMessage("Esperando criar ficha");
                    ab.setPositiveButton("OK",new DialogInterface.OnClickListener() 
                    {
                    	public void onClick(DialogInterface dialog, int whichButton) 
                    	{}
                    });
                    ab.show();
                    }
                   	
                    //mConversationArrayAdapter.clear();
                    break;
                case BluetoothChatService.STATE_CONNECTING:
                    setStatus(R.string.title_connecting);
                    break;
                case BluetoothChatService.STATE_LISTEN:
                case BluetoothChatService.STATE_NONE:
                    setStatus(R.string.title_not_connected);
                    break;
                }
                break;
            case MESSAGE_WRITE:
                
            	byte[] writeBuf = (byte[]) msg.obj;
                // construct a string from the buffer
                String writeMessage = new String(writeBuf);
                //mConversationArrayAdapter.add("Me:  " + writeMessage);
                Toast.makeText(getApplicationContext(), "Enviada:" + writeMessage,
                        Toast.LENGTH_SHORT).show();
                break;
            case MESSAGE_READ:
                byte[] readBuf = (byte[]) msg.obj;
                // construct a string from the valid bytes in the buffer
                String readMessage = new String(readBuf, 0, msg.arg1);
                Toast.makeText(getApplicationContext(), "Recebida:" + readMessage,
                        Toast.LENGTH_SHORT).show();
                //mConversationArrayAdapter.add(mConnectedDeviceName+":  " + readMessage);
                
                if(flag==-1){
                	 String[] ca = readMessage.split(Pattern.quote("/"));
		               
                     //fichabasica = FichaBasica.getInstance();
                     fichabasica.setAllCampos(ca[0]);
                     fichaDefesa.setAllCampos(ca[1]);
                     fichaAtributo.setAllCampos(ca[2]);
                     
                     
                     
                }
                break;
            case MESSAGE_DEVICE_NAME:
                // save the connected device's name
                mConnectedDeviceName = msg.getData().getString(DEVICE_NAME);
                Toast.makeText(getApplicationContext(), "Connected to "
                               + mConnectedDeviceName, Toast.LENGTH_SHORT).show();
                break;
            case MESSAGE_TOAST:
                Toast.makeText(getApplicationContext(), msg.getData().getString(TOAST),
                               Toast.LENGTH_SHORT).show();
                break;
            }
        }
    };

    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        
        String m = "sem";
        if(data!=null){m = "com data";}
        
        if(D) Log.d("on", "onActivityResult " + resultCode+"  "+m+ " "+Activity.RESULT_OK);
        switch (requestCode) 
        {
        case REQUEST_CONNECT_DEVICE_SECURE:
            // When DeviceListActivity returns with a device to connect
            if (resultCode == Activity.RESULT_OK) 
            {
                connectDevice(data, true);
            }
            break;
        case REQUEST_CONNECT_DEVICE_INSECURE:
            // When DeviceListActivity returns with a device to connect
            if (resultCode == Activity.RESULT_OK) 
            {
                connectDevice(data, false);
            }
            break;
        case REQUEST_ENABLE_BT:
            // When the request to enable Bluetooth returns
            if (resultCode == Activity.RESULT_OK) 
            {
                // Bluetooth is now enabled, so set up a chat session
            	if(D) Log.d("on", "entrou setup");
            	setupChat();
            } 
            else 
            {
                // User did not enable Bluetooth or an error occurred
                Log.d(TAG, "BT not enabled");
                Toast.makeText(this, R.string.bt_not_enabled_leaving, Toast.LENGTH_SHORT).show();
                finish();
            }
        }
    }

    private void connectDevice(Intent data, boolean secure) 
    {
    	
    	if(D) Log.d("on", "connctDevice"+" "+data.toString());
        // Get the device MAC address
        String address = data.getExtras()
            .getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);
        if(D) Log.d("on", "connctDevice"+" "+address);
        // Get the BluetoothDevice object
        BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
        
        if(D) Log.d("on", "divice"+" "+ device.getName());
        // Attempt to connect to the device
        //mChatService.connect(device, secure);
       
        mChatService.connect(device);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.option_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
    {
        Intent serverIntent = null;
        switch (item.getItemId()) 
        {
        case R.id.secure_connect_scan:
            // Launch the DeviceListActivity to see devices and do scan
            serverIntent = new Intent(TabWidgetFichaActivity.this, DeviceListActivity.class);
            startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE_SECURE);
            return true;
        case R.id.insecure_connect_scan:
            // Launch the DeviceListActivity to see devices and do scan
            serverIntent = new Intent(TabWidgetFichaActivity.this, DeviceListActivity.class);
            startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE_INSECURE);
            return true;
        case R.id.discoverable:
            // Ensure this device is discoverable by others
            ensureDiscoverable();
            return true;
            
        case R.id.rolar_dados:
        	serverIntent = new Intent(TabWidgetFichaActivity.this, RollMain.class);
        	startActivity(serverIntent);
        	return true;
        }
        return false;
    }
	
    @Override
    public void onStart() {
        super.onStart();
        if(D) Log.e(TAG, "++ ON START ++");
        //setBasica();
        setupChat();
        // If BT is not on, request that it be enabled.
        // setupChat() will then be called during onActivityResult
        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
        // Otherwise, setup the chat session
        } else {
            if (mChatService == null) setupChat();
        }
    }

    
   /**
    *  
    * @param s
    */
	private void debug(String s) {
		Log.d("TAG",s);
	}
	/**
	 * 
	 */
	private void carregaBasica(FichaBasica fb){
		fichaEnvia.append(fb.toString());
		
	}
	/**
	 * 
	 */
	private void carregaDefesa(FichaDefesa fd){
		fichaEnvia.append(fd.toString());
	}
	/**
	 *  
	 */
	private void carregaAtributo(FichaAtributo fa){
		 fichaEnvia.append(fa.toString());
	 }
	
	private void setBasica(){
		fichabasica.setNomeJogador(mCursor.getString(1));
		fichabasica.setNomePersonagem(mCursor.getString(2));
		fichabasica.setIdade(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_IDADE)));
		fichabasica.setXpTotal(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_XPTOTAL)));
		fichabasica.setIniciativa(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_INICIATIVA)));
		fichabasica.setNivel(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_NIVEL)));
		fichabasica.setRaca(mCursor.getString(mCursor.getColumnIndex(BDFicha.COL_RACA)));
		fichabasica.setTendencia(mCursor.getString(mCursor.getColumnIndex(BDFicha.COL_TENDENCIA)));
		fichabasica.setClasse(mCursor.getString(mCursor.getColumnIndex(BDFicha.COL_CLASSE)));
	}
	private void setFichaDef(){
		fichaDefesa.setArmadura(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_CLASSEARMADURA)));
		fichaDefesa.setFortitude(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_FORTITUDE)));
		fichaDefesa.setReflexo(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_REFLEXO)));
		fichaDefesa.setVontade(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_VONTADE)));
		fichaDefesa.setPontosVida(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_PONTOSDEVIDA)));
		
	}
	private void setFichaAtributo(){
		fichaAtributo.setForca(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_FORCA)));
		fichaAtributo.setCarisma(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_CARISMA)));
		fichaAtributo.setConstituicao(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_CONSTITUICAO)));
		fichaAtributo.setDestreza(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_DESTREZA)));
		fichaAtributo.setInteligencia(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_INTELIGENCIA)));
		fichaAtributo.setSabedoria(mCursor.getInt(mCursor.getColumnIndex(BDFicha.COL_SABEDORIA)));
	}
	
	private void connectDevice(String mac, boolean secure) 
    {
    	
    	if(D) Log.d("mac", "connctDevice"+" "+mac);
        // Get the device MAC address
        String address = mac;
        if(D) Log.d("mac", "connctDevice"+" "+address);
        // Get the BluetoothDevice object
        BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
        
        if(D) Log.d("mac", "divice"+" "+ device.getName());
        // Attempt to connect to the device
        //mChatService.connect(device, secure);
       
        mChatService.connect(device);
    }
}